package org.dbstar.scheduler.control;

import java.util.List;
import java.util.Set;

import org.dbstar.scheduler.beans.Job;
import org.dbstar.scheduler.control.exception.DaoException;
import org.dbstar.scheduler.identifier.Identifier;
import org.dbstar.scheduler.job.JobStatus;


/**
 * 提供控制Job的接口方法
 * 
 * @author 代波
 * @since 1.0.0
 * @version 1.0.0
 * @date 2012-3-29
 */
public interface JobController {
	/**
	 * 按条件查询所有匹配的Job的列表
	 * 
	 * @param jobIdentifier job标识
	 * @param confIdentifier jobConf标识
	 * @param type job类型
	 * @param status job状态
	 * @param succeed job是否成功
	 * @param submitter job提交人
	 * @param submitFrom 提交开始时间范围
	 * @param submitTo 提交结束时间范围
	 * @param page 分页页码
	 * @param pageSize 分页每页显示记录条数
	 * @return Job列表，若无任何Job，返回size为0的List。
	 * @throws DaoException 对象操作发生未知异常时抛出
	 */
	public abstract List<Job> searchJobs(Identifier jobIdentifier, Identifier confIdentifier, String type,
			JobStatus status, Boolean succeed, String submitter, Long submitFrom, Long submitTo, int page, int pageSize)
			throws DaoException;

	/**
	 * 按条件查询所有匹配的Job的数量
	 * 
	 * @param jobIdentifier job标识
	 * @param confIdentifier jobConf标识
	 * @param type job类型
	 * @param status job状态
	 * @param succeed job是否成功
	 * @param submitter job提交人
	 * @param submitFrom 提交开始时间范围
	 * @param submitTo 提交结束时间范围
	 * @return 匹配的Job数量
	 * @throws DaoException 对象操作发生未知异常时抛出
	 */
	public abstract int searchJobSize(Identifier jobIdentifier, Identifier confIdentifier, String type,
			JobStatus status, Boolean succeed, String submitter, Long submitFrom, Long submitTo) throws DaoException;

	/**
	 * 获得所有Job的列表
	 * 
	 * @return Job列表，若无任何Job，返回size为0的List。
	 * @throws DaoException 对象操作发生未知异常时抛出
	 */
	public abstract List<Job> getAllJobs() throws DaoException;

	/**
	 * 获得所有指定状态的Job的列表
	 * 
	 * @param jobStatus 指定的Job状态
	 * @return Job列表，若无任何Job，返回size为0的List。
	 * @throws DaoException 对象操作发生未知异常时抛出
	 */
	public abstract List<Job> getJobs(JobStatus jobStatus) throws DaoException;

	/**
	 * 获得所有指定JobConf的Job的列表
	 * 
	 * @param confIdentifier 指定的JobConf标识
	 * @return Job列表，若无任何Job，返回size为0的List。
	 * @throws DaoException 对象操作发生未知异常时抛出
	 */
	public abstract List<Job> getJobs(Identifier confIdentifier) throws DaoException;

	/**
	 * 根据Job标识来查找指定的Job
	 * 
	 * @param jobIdentifier Job标识
	 * @return Job标识对应的Job，若Job不存在，则返回null。
	 * @throws DaoException 对象操作发生未知异常时抛出
	 */
	public abstract Job getJob(Identifier jobIdentifier) throws DaoException;

	/**
	 * 获得第一个状态为Ready的Job。
	 * 
	 * @return 第一个状态为Ready的Job，若Job不存在，则返回null。
	 * @throws DaoException 对象操作发生未知异常时抛出
	 */
	public abstract Job getFirstReadyJob() throws DaoException;

	/**
	 * 获得第一个状态为Ready的Job，排除掉指定的resource。
	 * 
	 * @param excludeResources 需要排除的resource
	 * @return 第一个状态为Ready的Job，若Job不存在，则返回null。
	 * @throws DaoException 对象操作发生未知异常时抛出
	 */
	public abstract Job getFirstReadyJob(Set<String> excludeResources) throws DaoException;

	/**
	 * 增加新的Job。
	 * 
	 * @param job 新Job
	 * @return 新增Job的标识
	 * @throws DaoException 对象操作发生未知异常时抛出
	 */
	public abstract Identifier addJob(Job job) throws DaoException;

	/**
	 * 更新Job信息
	 * 
	 * @param job 需要更新的Job
	 * @throws DaoException 对象操作发生未知异常时抛出
	 */
	public abstract void updateJob(Job job) throws DaoException;

	/**
	 * 更新Job的状态
	 * 
	 * @param jobIdentifier Job对应的标识
	 * @param newStatus 更新后的状态
	 * @throws DaoException 对象操作发生未知异常时抛出
	 */
	public abstract void changeJobStatus(Identifier jobIdentifier, JobStatus newStatus) throws DaoException;

	/**
	 * 注册监听器
	 * 
	 * @param listener 监听器实例
	 * @param jobIdentifiers 匹配的Job标识
	 * @param confIdentifiers 匹配的JobConf标识
	 * @param jobStatus 匹配的Job状态
	 */
	public abstract void registJobStatusChangeListener(JobStatusChangeListener listener, Identifier jobIdentifiers[],
			Identifier confIdentifiers[], JobStatus... jobStatus);

	/**
	 * 注销监听器
	 * 
	 * @param listener 监听器实例
	 */
	public abstract void removeJobStatusChangeListener(JobStatusChangeListener listener);
}
